﻿using System;

namespace g4
{
    /// <summary>
    /// 三角形组设置行为结构体：定义在网格操作中如何为新创建的三角形分配组ID
    /// 支持三种模式：忽略组、自动生成组、使用指定组
    /// </summary>
    public struct SetGroupBehavior
    {
        /// <summary>
        /// 组设置模式枚举
        /// </summary>
        public enum Modes
        {
            Ignore = 0,       // 忽略组设置（不分配组ID，通常使用默认值-1）
            AutoGenerate = 1, // 自动生成新的组ID（从网格中分配未使用的组ID）
            UseConstant = 2   // 使用指定的固定组ID
        };

        /// <summary>
        /// 当前组设置模式
        /// </summary>
        Modes Mode;

        /// <summary>
        /// 当模式为UseConstant时使用的固定组ID
        /// </summary>
        int SetGroupID;

        /// <summary>
        /// 构造函数：初始化组设置行为
        /// </summary>
        /// <param name="mode">组设置模式</param>
        /// <param name="id">当模式为UseConstant时的固定组ID（默认0）</param>
        public SetGroupBehavior(Modes mode, int id = 0)
        {
            Mode = mode;
            SetGroupID = id;
        }

        /// <summary>
        /// 根据当前模式获取适用于网格的组ID
        /// </summary>
        /// <param name="mesh">目标网格（用于自动生成组ID时分配新ID）</param>
        /// <returns>计算得到的组ID</returns>
        public int GetGroupID(DMesh3 mesh)
        {
            switch (Mode)
            {
                case Modes.Ignore:
                    return -1; // 忽略组，返回无效组ID
                case Modes.AutoGenerate:
                    return mesh.AllocateTriangleGroup(); // 从网格分配新组ID
                case Modes.UseConstant:
                    return SetGroupID; // 使用预设的固定组ID
                default:
                    return -1; // 默认为忽略组
            }
        }

        /// <summary>
        /// 预定义的"忽略组"行为（返回-1）
        /// </summary>
        public static SetGroupBehavior Ignore
        {
            get { return new SetGroupBehavior(Modes.Ignore, 0); }
        }

        /// <summary>
        /// 预定义的"自动生成组"行为（从网格分配新组ID）
        /// </summary>
        public static SetGroupBehavior AutoGenerate
        {
            get { return new SetGroupBehavior(Modes.AutoGenerate, 0); }
        }

        /// <summary>
        /// 创建一个使用指定固定组ID的行为
        /// </summary>
        /// <param name="groupID">要使用的固定组ID</param>
        /// <returns>配置后的组设置行为</returns>
        public static SetGroupBehavior SetTo(int groupID)
        {
            return new SetGroupBehavior(Modes.UseConstant, groupID);
        }
    }


    /// <summary>
    /// 网格操作工具类（预留，用于集中存放网格相关的静态工具方法）
    /// </summary>
    public static class MeshOps
    {
        // 可在此添加网格操作的静态方法，如合并、分割、简化等
    }
}